package com.hl.ruoyilkshop.service.impl;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

import com.ruoyi.common.core.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.hl.ruoyilkshop.mapper.GoodsMapper;
import com.hl.ruoyilkshop.mapper.GoodsSpecsMapper;
import com.hl.ruoyilkshop.mapper.GoodsSpecRelationMapper;
import com.hl.ruoyilkshop.mapper.SpecsMapper;
import com.hl.ruoyilkshop.mapper.SkuMapper;

import com.hl.ruoyilkshop.domain.Goods;
import com.hl.ruoyilkshop.domain.GoodsSpecs;
import com.hl.ruoyilkshop.domain.GoodsSpecRelation;
import com.hl.ruoyilkshop.domain.Specs;
import com.hl.ruoyilkshop.domain.Sku;
import com.hl.ruoyilkshop.domain.dto.CreateGoodsRequest;
import com.hl.ruoyilkshop.domain.dto.SpecItemDTO;
import com.hl.ruoyilkshop.service.IGoodsService;
import com.hl.ruoyilkshop.service.ISkuService;

/**
 * 商品管理Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-08-07
 */
@Service
public class GoodsServiceImpl implements IGoodsService 
{
    @Autowired
    private GoodsMapper goodsMapper;

    @Autowired private GoodsSpecsMapper goodsSpecsMapper;
    @Autowired private SpecsMapper specsMapper;
    @Autowired private GoodsSpecRelationMapper goodsSpecRelationMapper;
    @Autowired private SkuMapper skuMapper;
    @Autowired private ISkuService skuService;

    /**
     * 查询商品管理
     * 
     * @param goodsId 商品管理主键
     * @return 商品管理
     */
    @Override
    public Goods selectGoodsByGoodsId(Long goodsId)
    {
        return goodsMapper.selectGoodsByGoodsId(goodsId);
    }

    /**
     * 查询商品管理列表
     * 
     * @param goods 商品管理
     * @return 商品管理
     */
    @Override
    public List<Goods> selectGoodsList(Goods goods)
    {
        return goodsMapper.selectGoodsList(goods);
    }

    /**
     * 新增商品管理
     * 
     * @param goods 商品管理
     * @return 结果
     */
    @Override
    public int insertGoods(Goods goods)
    {
        goods.setCreateTime(DateUtils.getNowDate());
        return goodsMapper.insertGoods(goods);
    }

    /**
     * 修改商品管理
     * 
     * @param goods 商品管理
     * @return 结果
     */
    @Override
    public int updateGoods(Goods goods)
    {
        return goodsMapper.updateGoods(goods);
    }

    /**
     * 批量删除商品管理
     * 
     * @param goodsIds 需要删除的商品管理主键
     * @return 结果
     */
    @Override
    public int deleteGoodsByGoodsIds(Long[] goodsIds)
    {
        return goodsMapper.deleteGoodsByGoodsIds(goodsIds);
    }

    /**
     * 删除商品管理信息
     * 
     * @param goodsId 商品管理主键
     * @return 结果
     */
    @Override
    public int deleteGoodsByGoodsId(Long goodsId)
    {
        return goodsMapper.deleteGoodsByGoodsId(goodsId);
    }

    /**
     * 聚合创建：商品 + 规格项/规格值/关联 + SKU（同一事务）
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createGoodsWithSpecsAndSkus(CreateGoodsRequest request) {
        Objects.requireNonNull(request, "请求不能为空");
        Goods goods = Objects.requireNonNull(request.getGoods(), "商品不能为空");

        // 1) 创建商品
        goods.setCreateTime(DateUtils.getNowDate());
        goodsMapper.insertGoods(goods);
        Long goodsId = goods.getGoodsId();

        // 2) 规格项/规格值/关联（简单版：直接插入；如需幂等请在表上加唯一键并改用 UPSERT）
        if (request.getSpecItems() != null) {
            for (SpecItemDTO item : request.getSpecItems()) {
                if (item == null || item.getSpecName() == null || item.getSpecName().trim().isEmpty()) continue;
                GoodsSpecs spec = new GoodsSpecs();
                spec.setGoodsSpecName(item.getSpecName().trim());
                spec.setBusinessId(goods.getBusinessId().intValue());
                goodsSpecsMapper.insertGoodsSpecs(spec);

                // 建立商品-规格关联
                GoodsSpecRelation rel = new GoodsSpecRelation();
                rel.setGoodsId(goodsId);
                rel.setGoodsSpecId(spec.getGoodsSpecId().longValue());
                rel.setBusinessId(goods.getBusinessId());
                goodsSpecRelationMapper.insertGoodsSpecRelation(rel);

                // 规格值
                if (item.getValues() != null) {
                    for (String v : item.getValues()) {
                        if (v == null || v.trim().isEmpty()) continue;
                        Specs sv = new Specs();
                        sv.setSpecsValue(v.trim());
                        sv.setGoodsSpecsId(spec.getGoodsSpecId());
                        sv.setBusinessId(goods.getBusinessId().intValue());
                        specsMapper.insertSpecs(sv);
                    }
                }
            }
        }

        // 3) SKU 列表（使用 SkuService 来处理 spec_key 和 spec_key_hash 的生成）
        if (request.getSkus() != null) {
            for (Sku sku : request.getSkus()) {
                if (sku == null) continue;
                sku.setGoodsId(goodsId.intValue());
                sku.setBusinessId(goods.getBusinessId().intValue());
                // 使用 SkuService 来处理 spec_key 和 spec_key_hash 的生成
                skuService.insertSku(sku);
            }
        }

        return goodsId;
    }
}
